Fork me on GitHub

MySQ-视图

注意:所有文章除特别说明外,转载请注明出处.

视图 view

定义与概念

通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

特性

视图是对于若干张基本表的引用,是一张虚表,查询语句执行的结果,不存储具体的数据,可以进行有限制的增删改查。

作用

方便操作,最主要的是查询操作,减少复杂的sql语句,增强可读性。

优势

1.分割数据,通过select与where来定义视图,从而可以分割数据基表中某些对于用户不关心的数据,使用户把注意力集中到所关心的数据列.进一步简化浏览数据工作。
2.给数据提供一定的逻辑独立性,如果我们为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据。
3.视图能像基本表一样授予或撤消访问许可权,给用户是表的一部分访问权限而不是全部。
4.视图可以间接对表进行更新,因此视图的更新就是表的更新。

规则和限制

1.唯一命名,不能与表或者其它视图重名。
2.视图可以嵌套,可以从其它视图中构造视图。
3.order by可以用在视图定义中,但是如果select语句从视图中检索数据的时候,在视图中的order by语句将会被覆盖。

视图/基本表区别

1.视图是已经编译好的sql语句,表不是。
2.视图没有实际的物理记录。表有。
3.表是内容,视图是窗口。
4.表只用物理空间,而视图不占用物理空间。视图只是逻辑概念的存在,表可以随时进行修改,但是视图只能由创建的语句来修改。
5.视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
6.视图的建立和删除只影响视图本身,不影响对应的基本表。


Java 数据库的操作

1.如何通过JDBC访问数据库

步骤:
1.加载JDBC驱动器
2.加载JDBC驱动(Class.forName(driver)) //driver="com.mysql.jdbc.Driver"
3.建立数据库连接,取得Connection对象
4.建立Statement对象或是PreparedStatement对象
5.执行sql语句
6.访问结果集ResultSet对象
7.依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放掉所占用资源

2.JDBC处理事务采用的方法

一个事务是由一条或多条对数据库操作的SQL语句组成的一个不可分割的工作单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。在JDBC中一般通过commit()方法或rollback()方法来结束事务的操作。

扩展:JDBC有哪些事务隔离级别

3.Class.forName()方法的作用

此方法的作用就是将类加载到JVM中,它会返回一个与带有给定字符串名的类或接口相关联的class对象,并且jvm会执行该类的静态代码段

4.Statement、PreparedStatement、CallableStatement之间的区别

1.Statement用于执行不带参数的简单SQL语句,并返回它所生成结果的对象,每次执行SQL语句时,数据库都要编译该SQL语句
2.PreparedStatement表示预编译SQL语句的对象,用于执行带参数的预编译SQL语句
3.CallableStatement提供用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数

5.getString()方法与getObject()方法的区别

1.getObject()方法可以解决当查询结果集中的数据量较大时,避免其不会抛出OracleException异常。
2.getString()方法或getInt()方法被调用时,程序会一次性将数据都放在内存中,然后通过ResultSet的next()和getString()方法来获取数据。

6.使用JDBC需要注意的一些问题

1.首先要建立数据库的连接,才能完成对数据库的访问
2.正常关闭和释放JDBC连接,JDBC资源才可以被快速地重用,从而使得系统性能得到改善。


MySQL数据库字段 时间类型

在MySQL中经常用来存储日期的数据类型包括:Date Datetime Timestamp

1.Date数据类型

表示用来存储没有时间的日期,此类型的格式为:YYYY-MM-DD 范围是:1000-00-00到9999-12-31

2.Datetime类型

存储有日期和时间的数据,此类型的格式: YYYY-MM-DD HH:MM:SS 范围是:1000-00-00 00:00:00 - 9999-12-31 23:59:59

3.Timestamp类型

存储既有时间又有日期的数据,此类型的格式: YYYY-MM-DD HH:MM:SS 范围是:1000-00-00 00:00:00 - 9999-12-31 23:59:59

4.TIMESTAMP和DATETIME相同点

两者都可用来表示YYYY-MM-DD HH:MM:SS[.fraction]类型的日期

5.TIMESTAMP和DATETIME的不同点

1.两者的存储方式不一样,TIMESTAMP将客户端插入的时间从当前时区转换为UTC(世界标准时间)存储。查询的时候又转化为客户端当前时区时间进行返回。对于DATETIME两者不做任何的改变,基本都是原样的输入输出。

2.两者能够存储的时间范围不一样,timestamp所能存储的时间范围为:’1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’。datetime所能存储的时间范围为:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。



MySQL - 命令

1.存储引擎:ENGINE = engine_name
存储引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive 

2.列属性:
    1.unique 唯一索引(唯一约束) 使得某字段的值不能重复
    2.auto_increment 自增约束 默认为1开始自动增长。可以通过表属性 auto_increment = x进行设置,或 alter table tbl auto_increment = x;
    3.foreign key 外键约束 用于限制主表与从表的数据完整性。存在外键的表称之为从表,外键指向的表称之为主表。作用:保持数据的一致性,完整性,主要目的是控制存储在外键表(从表)中的数据。

3.属性
    1.group子句 group by 字段/别名 [排序方式]
    group by 表示按照某种方式进行分组

    排序方式:升序:ASC,降序:DESC

        合计函数需要配合group by使用:
            1.count 返回不同的非NULL值数目 count(*)、count(字段)
            2.sum 求和
            3.max 求最大值
            4.min 求最小值
            5.avg 求平均值

    2.having子句 与where 功能 用法相同,执行时机不同

        where 在开始时执行检测数据,对原数据进行过滤。having 对筛选出的结果再次进行过滤。having 字段必须是查询出来的,where 字段必须是数据表存在的。

    3.order by 子句 排序子句
        order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]... 升序:ASC,降序:DESC

    4.limit 子句,限制结果数量子句
        仅仅只对处理好的结果进行数量限制,将处理好的结果看作是一个集合,按照记录出现的顺序,索引从0开始。

        limit 起始位置,获取条数 省略第一个参数,表示从索引0开始,limit获取条数。

    5.distinct all 选项
        distinct 表示去除重复记录,默认值为all,全部记录。

    6.列子查询 
        如果子查询结果返回的是一列,使用 in 或者 not in 完成查询。

    7.JOIN
        该命令用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
        select * from persons INNER JOIN Orders ON persons.id_p = Orders.id_p ORDER BY persons.LastName

扩展:1.JOIN: 如果表中有至少一个匹配,则返回行。2.INNER JOIN:该语句表示产生的结果集中是两个表的交集。3.FULL[OUTER] JOIN:表示产生两个表的并集。 2.LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行。表示产生左边表的完全集,如果右表中有匹配则有值,否则由null代替。 3.RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行 4.FULL JOIN: 只要其中一个表中存在匹配,就返回行

8.mysql操作查询结果(case when then else end)
    在这里case有两种格式:
        1.简单case函数
            CASE sex 
                WHEN '1' THEN '男' 
                WHEN '2' THEN '女' 
            ELSE '其他' END 

        2.case搜索函数 
            CASE WHEN sex = '1' THEN '男' 
                WHEN sex = '2' THEN '女' 
            ELSE '其他' END 

注意:这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。

9.mysql cast & convert函数
    MySQL的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。
    用法:
        CAST(value as type);
        CONVERT(value, type);

注意:转换的类型是有限制的,该类型可包括(BINARY,CHAR,DATE,TIME,DATETIME,DECIMAL,SIGNED,UNSIGNED)。

10.mysql using & on 
    在用join进行多表查询的时候,通常使用on来建立两表的关系,但还有一个更方便的关键字using
        例:
            select a.name,b.age from test as a
                join test2 as b
                on a.id=b.id

            select a.name,b.age from test as a
                join test2 as b
                using(id)
        //上面的两个程序实等价的。

11.mysql FIND_IN_SET()函数
    FIND_IN_SET(str, strList):str表示要查询的字符串 strList表示查询字段中包含str结果。

        select * from tt_course WHERE FIND_IN_SET('15', btype);

注意:FIND_IN_SET与like的区别:like是广泛的模糊查询,字符串中没有分隔符。FIND_IN_SET是精确匹配,字段值以英文”,”分割,FIND_IN_SET查询的结果小于like查询的结果。


提示:在mysql中使用Navicat可视化界面的时候如果遇到错误:1045 Access denied for user 'root'@'localhost' (using password:YES)或许是因为误删了root用户,然后在Navicat中直接添加上root用户即可。密码和你数据库密码一致。(user:root pass:xxx)。


MySQL的主从分离实现

利用mysql的主从配置实现主从分离。1.从数据库层面实现主从分离的配置。2.从程序的读写方面实现(不需要改变现有的程序)。

主从库理论

主从同步工作原理:1.主数据库将数据信息记录到二进制文件当中。2.然后从服务器就会同步主服务器的数据信息。3.然后从服务器上的线程同步执行操作。

本文标题:MySQ-视图

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:05:22

原始链接:http://bangjinhu.github.io/undefined/MySQL 命令 视图/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.